import axios from 'axios'
import QS from 'qs'
import {Toast} from 'vant';
// 引入vuex的状态管理机制，在每次发送请求前我们都要判断vuex中是否存在token
import store from '@/store/index.ts'
// 判断不同的开发环境，从而设置不同的baseURL
if(process.env.NODE_ENV === 'development'){
    axios.defaults.baseURL = 'https://www.baidu.com'
}else if(process.env.NODE_ENV === 'debug'){
    axios.defaults.baseURL = 'https://www.baidu.com'
}else if(process.env.NODE_ENV === 'production'){
    axios.defaults.baseURL = 'https://www.baidu.com'
}
axios.defaults.timeout = 10000; // 设置请求超时参数
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; // 添加post请求头
// 请求拦截
axios.interceptors.request.use(
    config =>{
        // 每一次发送接口请求之前，我们都要判断是否存在token
        const token = store.state.token;
        // 如果存在token，那么我们就把token给到接口的请求头上
        token && (config.headers.Authorization = token);
        // 当然，即使本地存在token，也有可能是过期的，所以在拦截器中还要对返回状态进行判断
        return config
    },
    error => {
        return Promise.error(error)
    }
)
// 响应拦截
axios.interceptors.response.use(
    response => {
        // 如果返回状态码为200，说明接口请求成功，否则的话，抛出错误
        if(response.status === 200){
            return Promise.resolve(response)
        }else{
            return Promise.reject(response)
        }
    },
    error => {
        // 如果返回是其他的状态码
        if(error.response.status){
            switch (erroe.response.status) {
                // 401: 未登录
                // 未登录则跳转登录页面，并携带当前页面的路径
                // 登录成功之后跳转到当前页面，这一步在登录页操作
                case 401 :
                    router.replace({
                        path: '/login',
                        query: {
                            redirect: router.currentRoute.fullPath  // 把当前页面的路径保留下来，从而在登录成功之后返回
                        }
                    })
                    break;
                // 403：token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页重新登录
                case 403 :
                    Toast({
                        message: '登录过期，请重新登录',
                        duration: 1000,
                        forbidClick: true
                    });
                    // 清除token
                    sessionStorage.removeItem('token');
                    store.commit('loginSuccess',null);
                    // 跳转登录页，并且将当前浏览页面的路径传过去，登录成功跳转该页面
                    setTimeout(()=>{
                        router.replace({
                            path: '/login',
                            query: {
                                redirect: router.currentRoute.fullPath  // 把当前页面的路径保留下来，从而在登录成功之后返回
                            }
                        })
                    },1000)
                    break;
                // 404: 网络请求不存在
                case 404 :
                    Toast({
                        message: '网络请求不存在',
                        duration: 1500,
                        forbidClick: true
                    });
                    break;
                // 其他错误，直接抛出接口返回信息
                default :
                    Toast({
                        message: error.response.data.message,
                        duration: 1500,
                        forbidClick: true
                    });
            }
            return Promise.reject(error.response)
        }
    }
)
// 封装get请求
/**
 * get方法，对应get请求
 * @param {String} url: [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * */
export function get(url,params){
    return new Promise((resolve,reject)=>{
        axios.get(url,{
            params: params
        }).then(res =>{
            resolve(res.data);
        }).catch(err =>{
            reject(err.data)
        })
    })
}
// 封装post请求
/**
 * post方法，对应post请求
 * @param {String} url: [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * */
export function post(url,params){
    return new Promise((resolve,reject)=>{
        // 这里要注意，post和get的参数放置的位置不一样，post就是一个对象，而get要把参数放到一个对象里面去
        // 而且这里的参数还要经过一个序列化的操作，否则后端就接收不到参数
        axios.post(url,QS.stringify(params)).then(res =>{
            resolve(res.data);
        }).catch(err =>{
            reject(err.data)
        })
    })
}
